package com.ggk911.pharmacy_system.interceptor;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.ggk911.pharmacy_system.util.JWTUtil;
import com.ggk911.pharmacy_system.util.RestResult;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 登录拦截器
 *
 * @author ggk-911
 * @version 1.0 2023/2/24 14:15
 */
@Slf4j//日志
@RequiredArgsConstructor
public class MyInterceptor implements HandlerInterceptor {
    private final JWTUtil jwtUtil;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("此请求不是白名单");
        log.info("请求的地址" + request.getRequestURL());
        //判断当前的请求是否属于本项目中的某个方法
        if (handler instanceof HandlerMethod) {

            //获取请求中的header部分
            String token = request.getHeader("token");
            //jsonTool工具
            ObjectMapper jsonTool = new ObjectMapper();
            //先检查是否存在token
            if (token == null || "".equals(token)) {
                //不允许继续访问，同时给前端反馈一个结果。
                //将返回给前端的结果转换为JSON字符串
                String restJson = jsonTool.writeValueAsString(RestResult.error(1, "未登录(token不存在)"));
                //将该字符串写入到响应中,写入时参数为字节数组，这里将字符串转换为字节数组
                response.getOutputStream().write(restJson.getBytes("UTF-8"));
                //设置响应类型
                response.setContentType("application/json;charset=utf-8");
                log.info("因为token为空拒绝了地址" + request.getRequestURL() + "的访问");
                return false;
            }
            //验证发送请求时携带的token
            RestResult restResult = jwtUtil.verifyAndConvertToken(token);
            //验证后判断token是否正确
            if (restResult.getCode() != 0) {
                //不允许继续访问，同时给前端反馈一个结果。
                //将返回给前端的结果转换为JSON字符串
                String restJson = jsonTool.writeValueAsString(restResult);
                //将该字符串写入到响应中,写入时参数为字节数组，这里将字符串转换为字节数组
                response.getOutputStream().write(restJson.getBytes("UTF-8"));
                //设置响应类型
                response.setContentType("application/json;charset=utf-8");
                log.info("因为token验证未通过拒绝了地址" + request.getRequestURL() + "的访问");
                return false;
            }


        }
        log.info("拦截器通过，返回了true");
        return true;
    }
}

